<?php
namespace app\model;

use think\Model;

class Device extends Model
{
    // 设置数据表名
    protected $name = 'device';
    // 添加字段映射关系（关键修复）
    protected $schema = [
        'id'          => 'int',
        'name'        => 'string',
        'serial_no'   => 'string',
        'protocol'    => 'string',
        'model'       => 'string',
        'location'    => 'string',
        'latitude'    => 'float',
        'longitude'   => 'string',
        'group_id'    => 'int',
        'status'      => 'int',
        'last_online' => 'datetime',
        'last_data_time' => 'datetime',
        'create_time' => 'datetime',
        'update_time' => 'datetime',
        'delete_time' => 'datetime',
    ];
    
    // 添加追加字段（重要）
    protected $append = [
        'status_text',
        'protocol_text'
    ];

    
    // 开启自动写入时间戳
    protected $autoWriteTimestamp = true;
    
    // 软删除
    use \think\model\concern\SoftDelete;
    protected $deleteTime = 'delete_time';
    
    // 添加设备组关联关系
    public function group()
    {
        return $this->belongsTo(DeviceGroup::class, 'group_id', 'id');
    }
    
    // 关联设备数据
    // 重命名关联方法避免与父类冲突（关键修改）
    public function deviceData()
    {
        return $this->hasMany(DeviceData::class, 'device_id');
    }
    
    // 状态获取器
    public function getStatusTextAttr()
    {
        $status = [
            0 => '离线',
            1 => '在线',
            2 => '故障'
        ];
        return $status[$this->status] ?? '未知';
    }
    
    // 协议获取器
    public function getProtocolTextAttr()
    {
        $protocols = [
            'mqtt' => 'MQTT',
            'coap' => 'CoAP',
            'http' => 'HTTP',
            'modbus' => 'Modbus',
            'zigbee' => 'ZigBee',
            'lora' => 'LoRa'
        ];
        // 添加null值处理
        $protocol = $this->protocol ?? '';
        return $protocols[strtolower($protocol)] ?? '未知';
    }
    
    // 搜索设备名称
    public function searchNameAttr($query, $value, $data)
    {
        // 当name参数存在且非空时进行模糊查询
        if (!empty($value)) {
            $query->where('name', 'like', '%'.$value.'%');
        }
    }
    
    public function searchStatusAttr($query, $value, $data)
    {
        // 当status参数存在且是有效数字时查询
        if (isset($data['status']) && is_numeric($data['status'])) {
            $query->where('status', $data['status']);
        }
    }
    
    public function searchGroupIdAttr($query, $value, $data)
    {
        // 当group_id参数存在且是有效数字时查询
        if (isset($data['group_id']) && is_numeric($data['group_id'])) {
            $query->where('group_id', $data['group_id']);
        }
    }
    
    public function searchProtocolAttr($query, $value, $data)
    {
        // 当protocol参数存在且非空时精确匹配
        if (!empty($value)) {
            $query->where('protocol', $value);
        }
    }
} 